﻿#ifndef LIBXYSENSOR_H
#define LIBXYSENSOR_H

#include <string>
#include <functional>
#include <mutex>
#include <thread>

/* *******************************
 * 使用方式
 * 1. 声明对象 LibXySensor sensor;
 * 2. RegistCallback注册视频、连接状态的回调函数
 * 3. 调用Connect(ip)连接到控制盒
 * 4. 视频回调函数就会收到连续视频和算法结果
 * ******************************/


enum eFrameType {
    FRAME_TYPE_YUV422P = 0,
    FRAME_TYPE_Y16,
    FRAME_TYPE_X16,
    FRAME_TYPE_H264,
    FRAME_TYPE_Y
};

// 视频图像信息
struct sFrameInfo {
    uint64_t headFlag;  // 帧头
    uint64_t uId;       // 时间戳/帧id
    int frameLen;       // 图像数据长度
    int width;          // 图像宽
    int height;         // 图像高
    eFrameType type;    // 视频类型（默认是yuv422p格式）
};


struct sAlgRect {
    int x;              // 左上角x坐标
    int y;              // 左上角y坐标
    int w;              // 区域宽
    int h;              // 区域高
};

// 检测算法信息
struct sAlgInfo {
    uint64_t uId;       // 时间戳/帧id
    bool isAlarm;       // 是否报警 true报警 false不报警
    int rectCount;      // 检测到对象个数
    sAlgRect rect[100]; // 检测到对象的区域
};

/**
 * @brief WsVideoDataCb 视频回调函数
 * char*       数据为一帧的完整图像
 * sFrameInfo  图像信息
 * sAlgInfo    检测报警信息
 */
typedef std::function<void(char*, sFrameInfo, sAlgInfo)> WsVideoDataCb;

/**
 * @brief WsVideoStatusCb 连接状态回调，连接成功、异常断开会触发
 * 1连接成功 0连接断开
 */
typedef std::function<void(int)> WsVideoStatusCb;


class LibXySensor
{
public:
    LibXySensor();
    ~LibXySensor();

    /**
     * @brief RegistCallback 注册回调函数
     * @param videoCb        视频回调
     * @param statusCb       连接状态回调
     */
    void RegistCallback(WsVideoDataCb videoCb, WsVideoStatusCb statusCb);

    /**
     * @brief Connect 连接控制盒
     * @param ip      控制盒IP
     */
    void Connect(std::string ip);

    /**
     * @brief DisConnect 断开连接
     */
    void DisConnect();

private:
    void process();
    bool parseFrame(unsigned char* inFrame, int inLen);

private:
    std::mutex m_mutex;
    bool m_isRunning = false;
    std::thread* m_videoThread = nullptr;

    std::string m_ip;
    int m_port;

    int m_maxSize;
    char* m_cacheBuffer = nullptr;
    char* m_videoBuffer = nullptr;
    sFrameInfo m_frameInfo;
    sAlgInfo m_algInfo;

    WsVideoDataCb m_videoCb = nullptr;
    WsVideoStatusCb m_statusCb = nullptr;
};

#endif // LIBXYSENSOR_H
